{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "28982d68-9cae-4726-8103-57bbee7fe8c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "import warnings\n",
    "\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d999a1c2-32b2-4a5c-9478-4747dfb5bbc9",
   "metadata": {},
   "source": [
    "## 模拟梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1afe2c74-027d-433d-acb0-d7c0203bc4db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f2bd09da6e0>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "f = lambda x : (x - 3.5) ** 2 - 4.5 * x + 10\n",
    "# 导函数\n",
    "g = lambda x : 2 * (x - 3.5) - 4.5\n",
    "\n",
    "plt.figure(figsize = (6, 3))\n",
    "X = np.linspace(0, 11.5)\n",
    "plt.plot(X, f(X))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3ca62b40-a9bf-4926-a8a0-d57d9a75c99b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始点: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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0tLSbLnNm1Qbaq0tB9HR0Qy1RERERH7MF62ifFCMiIiIiFSPoZaIiIiIVI+hloiIiIhUj6GWiIiIiFSPoZaIiIiIVI+hloiIiIhUT7VbevmS2WxC6f69aKitQWRsHFL7ZUGr1Sk9LSIiIiI6j6G2HSXbtmLzmlfQcLradi0yPgETps9E5sjRCs6MiIiIiKzYfuBCybatWL8i3y7QAkDD6WqsX5GPkm1bFZoZEREREbXEUNsGs9mEzWtecVnz1dpXYDabfDQjIiIiImoLQ20bSvfvdVihba3+t2qU7t/roxkRERERUVsYatvQUFvj0ToiIiIi8h6G2jZExsZ5tI6IiIiIvIehtg2p/bIQGZ/gsiaqawJS+2X5aEZERERE1BaG2jZotTpMmD7TZc34aTO5Xy0RERGRH2CodSFz5GhMnZvnsGIb1TUBU+fmcZ9aIiIiIj/BwxfakTlyNDJGjOSJYkRERER+jKFWAq1Wh7SsQUpPg4iIiIjawPYDIiIiIlI9hloiIiIiUj2GWiIiIiJSPYZaIiIiIlI9hloiIiIiUj2GWiIiIiJSPYZaIiIiIlI9hloiIiIiUj2GWiIiIiJSPYZaIiIiIlI9hloiIiIiUj2GWiIiIiJSPYZaIiIiIlI9xULtmjVroNFonL6cPHlSqWkRERERkQoFKfWGb7rpJowbN87u2l//+ldUVVWhR48eykyKiIiIiFRJsVAbGRmJyMhI25/LysrwySef4LvvvlNqSkRERESkUn7TU/vss89i8uTJGDhwoNJTISIiIiKVUWyltiWDwYA1a9bg/fffd1ljMBhsf9br9b6YGhERERGpgF+s1H788ceIjo7GhAkT2qxZtmwZYmJibC9paWk+nCERERER+TO/CLUffPABrr76amg0mjZrFi5ciLq6OtvLiRMnfDhDIiIiIvJnircfGI1GFBUV4d1333VZFxISgpCQEB/NioiIiIjURPGV2uLiYuj1eowZM0bpqRARERGRSikeardv34709HRERUUpPRUiIiIiUinFQ+2uXbswYMAApadBRERERCqmeE/t6tWrlZ4CEREREamc4iu1REREREQdxVBLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqsdQS0RERESqx1BLRERERKrHUEtEREREqhek9AQ6O7PZhNL9e9FQW4PI2Dik9suCVqtTelpEREREqsJQq6CSbVuxec0raDhdbbsWGZ+ACdNnInPkaAVnRkRERKQubD9QSMm2rVi/It8u0AJAw+lqrF+Rj5JtWxWaGREREZH6MNQqwGw2YfOaV1zWfLX2FZjNJh/NiIiIiEjdGGoVULp/r8MKbWv1v1WjdP9eH82IiIiISN0YahXQUFvj0ToiIiKizo6hVgGRsXEerSMiIiLq7BhqFZDaLwuR8Qkua6K6JiC1X5aPZkRERESkbgy1CtBqdZgwfabLmvHTZnK/WiIiIiKJGGoVkjlyNKbOzXNYsY3qmoCpc/O4Ty0RERGRDDx8QUGZI0cjY8RInihGRERE1EEMtQrTanVIyxqk9DSIiIiIVI3tB0RERESkegy1RERERKR6DLVEREREpHoMtURERESkegy1RERERKR6DLVEREREpHoMtURERESkegy1RERERKR6DLVEREREpHoMtURERESkeoqG2oaGBtx9992IjY1FXFwcbr/9dtTV1Sk5JSIiIiJSIUVD7axZs/DDDz/gww8/xMaNG3HkyBHcddddSk6JiIiIiFQoSKk3XFFRgXfffRe//PILMjIyAAAffvgh9Hq9UlMKOGazCaX796KhtgaRsXFI7ZcFrVan9LSIiIiIPE6xULtlyxb06dMHW7duxaRJkyCEwJ133olFixYpNaWAUrJtKzaveQUNp6tt1yLjEzBh+kxkjhyt4MyIiIiIPE+xUHv06FFUVVXh+eefx8svvwwhBGbPno3g4GDk5eU51BsMBhgMBtufuaLbtpJtW7F+Rb7D9YbT1Vi/Ih9T5+Yx2BIREVFAUayntrGxEWfPnsX69euRk5ODiRMnIj8/H6+99prT+mXLliEmJsb2kpaW5uMZq4PZbMLmNa+4rPlq7Sswm00+mhERERGR9ykWart06YIBAwagW7dutmv9+/fH8ePHYTI5Bq6FCxeirq7O9nLixAlfTlc1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Hj2UmRR1mLP7euzYMd5TP3bmzBlMnjwZp0+fxrZt22z3ivdSXbZs2YL9+/fj7rvvtl3LysrC2bNnERISwnupIvn5+aiursaYMWNs1wwGA2644QaMGTOG91JlunfvbvePk4yMDABAaGioau4l2w/aMXr0aBw4cMDuhm7atAm9evVy2lBN6nDppZdiw4YNdtc2bdqESy65RKEZUXvuuece1NbW4ptvvrH7Zsp7qS5HjhzBokWL7H51WVJSAo1Ggz/+8Y8oLCyE2Wy2/R3vpf9auHAh9u3bh59++sn20r17dzz//PPIycnh16WKfPbZZ+jbty8aGhps1/bt2wcA6vq6VHr7BTW46aabxNixY8WPP/4oioqKRPfu3cVTTz2l9LRIpssvv9y2pdepU6dEVFSUePzxx8X+/ftFfn6+CAsLE0ePHlV4luTM559/LoKDg8XGjRvFkSNH7F6OHz/Oe6kiDQ0Nok+fPuLGG28UO3fuFF9//bXIzs4W11xzjWhqahJpaWni/vvvF/v27ROrV68WXbp0Ed9//73S0yaJevXqJQoKCvg9VmUMBoO46KKLxFVXXSV27NghPv/8c5GVlSWuvPJKVX1dMtRKUFNTI/7nf/5HREZGivj4ePHII48Ik8mk9LRIppahVggh/vvf/4ohQ4aILl26iH79+omNGzcqODty5U9/+pMA4PTlyJEjvJcqc+DAATFp0iQRFRUlunXrJqZNmyaqqqqEEELs2bNHjBkzRoSEhIj09HTxxhtvKDxbksMaaoXg91i1OXTokLj66qtFTEyMSEpKErfddpsoKysTQqjn61IjBM97JSIiIiJ1Y08tEREREakeQy0RERERqR5DLRERERGpHkMtEREREakeQy0RERERqR5DLRERERGpHkMtEZGXmUwm2/+fOXPG4Rx1KR588EH85S9/gdFobLe25ck/RESdBUMtEZEEp06dwvr1621/3rp1K5599lkIIdCtWzd88sknbb5u79698Ze//AUA8NFHHyEkJATHjx9HUVERfvjhB7taIQQ++eQT1NXV2a6dOXMGr776KsLCwhAUFNTm2ykuLkZDQwNuu+02PP7446isrLSNs2TJEsydOxfcmpyIAhVDLRGRBJWVlbj11ltRUVEBAHj11Vdx4MABaDQadO3aFampqU5f79ChQzhx4gSuu+46AEBycjIiIiLQs2dPfPXVV7j55puh1+tt9dXV1bjnnntw33332a79+9//RlhYmC0Yt3T27Fnb/y9btgyvvPIKwsLC0KtXLyxfvhzPPvssAODTTz9FY2MjNBpNhz8WRET+iKGWiEiCIUOGoH///tiwYQNqa2vxySef4NNPP8UFF1yAkpISXH/99ejTpw/i4+NRXFxse7133nkHw4cPx+jRowEAXbt2tQXLxx57DCkpKfjpp5/w22+/AQASExPxv//7v3jvvfewefNmAMA//vEP1NTUICYmBkFBQbYXrVaLjRs3AgAaGhrw5z//Genp6dBoNNDpdBBCYPbs2WhqasLPP/+MpKQkvPfee3jzzTexbt06X374iIi8jsfkEhFJVFNTg7i4OPz5z3/G/v37UVRUBABIS0vDpk2b0LdvX9TU1CAqKgpdunRBY2MjMjMzMXr0aHz44YcAgOPHjyMjIwM7duzA1q1bsXXrVnz77bdISUnBli1bAFhaEC6//HLMnDkTwcHBeOCBB3Dw4EEYDAbEx8cjKCgI7733Hh566CGUlpYiKCgICxYswIoVK6DVamEwGBATE4MuXbqgpqYGa9aswdy5c/GHP/wBxcXFqKqqwm233YalS5cq9rEkIvI0hloionbs3LkTBw4cQJcuXXDBBRcgNDQUGo0GmZmZAIDIyEgcOXIEiYmJMBqNaGxsRExMDBYtWoQnnngCN954I6ZNm4bdu3fjv//9LwoLC5Geno6RI0dixIgRGDZsGPr164eUlBS7t3vixAkMGTIES5cuxaxZs9CzZ0/ceeedWLJkCQYPHoyJEydi5cqVACwPox0+fBjTp09HXFwcRo8ejaNHj2LlypW477770LNnTzzxxBNYsGABzpw5g1WrVvn6w0hE5FVtP3FAREQAgH379uGtt97Cnj17kJeXh23btmHdunWIjo6GyWRCU1MTevfuDcDS45qSkoJ169Zh+fLlmDhxIgBg+fLlGDhwIO677z7s27cPq1evRk5OTptv87PPPkNwcDDefPNN5ObmAgDOnTuHtLQ0GAwGLF++HIMGDbLVv/TSS3juuefw0UcfYdWqVUhNTcXJkyfx97//HR9++CH69u2Lu+66C1VVVbYwTkQUSNhTS0TUjttvvx0bNmzApZdeiuDgYLz++utoampCeXk58vLyEB8fj59//hkNDQ0wGo04ePAgjEYjZsyYgUsvvRQAsGXLFrz00ku4/vrrcemll+K7775z+TZffvllvPDCC5gyZQqCgoLQ2NiIyspKHD58GOHh4bj66qvRs2dPW/3kyZPx5ZdfIj4+Hp999hlycnLw4osv4oknnsCOHTsQHh4Og8GAw4cPM9QSUUBiqCUikkmrtXzrPHnyJJ555hnMnDkTY8aMsT0gFhoaissuuwwvvfSS09efPHmyyy3ADh48iM8++wzz58+3XSssLMTAgQNtD4a19sILL2Do0KEYMGAATCYTJk6ciJSUFGRnZ6Nv374YNmwYdu3ahZ07d2LIkCFuvudERP6LoZaIyA27d+/GhAkTMGvWLOTn5+O5557DFVdcYRdW29o+67rrrsO+ffvw/fffO/37BQsWYOzYsbZVXpPJhGXLlmHatGmIiYnByy+/7PA6zz33HA4dOoTo6Gjs3r0bO3bsQGRkJJYsWQIAuPbaa7F48WIkJiYiIyOjo+8+EZHfYU8tEZFEp0+fRmVlJb788ktcddVVWLhwIfLy8gAAt9xyC6qqqnDXXXdh7NixiI+Pb3Oc2NhYzJw5E/fccw+Ki4tRUFAAg8GAO+64A2+99RY++ugjfPHFFwAsfbQzZ85EfX09Zs+ejZEjR2L8+PEwGAx44IEHbKvGAPDtt98iPj4eY8aMQVxcHBISEjBp0iQAQEZGBg4ePIg5c+Z47wNERKQg7n5ARNQOg8GAu+66C3v27EFjYyMuuugijBs3Drm5uYiMjAQANDc3w2Aw4Ndff0V0dDQuv/xyhISEYNGiRdi7dy/+/e9/241ZV1eHESNGICoqCsnJyRBCYMOGDSgoKMDTTz+NdevWoaCgACtWrEBzczOKioqQnp4OAFi9ejXuvfde9OnTB3fddRcWLFiAc+fOoaysDMXFxXjqqacQGhoKvV6P6dOno2fPnrjvvvtwxRVXYMOGDbj33nsxd+5cJCUl+fpDSUTkPYKIiFw6fPiwmDx5smhoaBBGo1H861//EuPGjRPp6ekiISFBREREiODgYAFAABCjRo2yve7/+3//T0yePNnpuCdPnhRTpkwRGo1GfPDBB7brZ8+eFSdPnhRjxowRf/rTn0R1dbXD6xYVFYnMzExRVFRkezsAxNChQ8Xq1auF0WgUJ0+eFL169RLJycli7dq1QgghduzYIXr37i0eeOABT36IiIgUx5VaIiIPMhqNAICgIOndXfX19YiKinK4bjab7doLWjOZTNDpdAAsq8nV1dUOx/UWFxcjKysLERERdm9Pp9MhPDxc8hyJiPwdQy0RERERqR53PyAiIiIi1WOoJSIiIiLVY6glIiIiItVjqCUiIiIi1WOoJSIiIiLVY6glIiIiItVjqCUiIiIi1WOoJSIiIiLVY6glIiIiItVjqCUiIiIi1fv/ZGDnSwUiUbAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#梯度下降，迭代次数为 times，eta 为学习率，start 为初始值\n",
    "def update(eta, start=0, times=1000):\n",
    "    #假设起始值相同\n",
    "    x = start\n",
    "    #记录所有变化的 x\n",
    "    res = []\n",
    "    for i in range(times):\n",
    "        x = x - eta * g(x)\n",
    "        res.append(x)\n",
    "    return np.array(res)\n",
    "\n",
    "plt.figure(figsize = (8, 4))\n",
    "\n",
    "#----------------------------------------\n",
    "\n",
    "start_x = np.random.randint(0, 12, size = 1)[0]\n",
    "print('开始点:', start_x)\n",
    "\n",
    "# 多个学习率\n",
    "etas = [0.0001, 0.001, 0.01, 0.1, 0.3, 0.8]\n",
    "\n",
    "# 查看每个学习率下单变量 x 的收敛情况\n",
    "for e in etas:\n",
    "    times = 50\n",
    "    plt.scatter(np.arange(times), update(e, start = start_x, times = times))\n",
    "\n",
    "#----------------------------------------\n",
    "\n",
    "plt.xlabel('迭代次数')\n",
    "plt.ylabel('x')\n",
    "\n",
    "#图例\n",
    "_ = plt.legend(etas, \n",
    "           fontsize=12,\n",
    "           loc='center', \n",
    "           ncol=6, \n",
    "           bbox_to_anchor=[0.5, 1.1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "868e4bfd-c0d6-41b4-9d6e-28bbbd744be1",
   "metadata": {},
   "source": [
    "## 三种梯度下降方法实战"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ee5a958-e8d1-43d1-ba19-8741b15debea",
   "metadata": {},
   "source": [
    "### BGD 批量梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70d6eb1c-160a-4c36-9d90-f24b8c4c3217",
   "metadata": {},
   "source": [
    "<font color=green size=6>$\\theta^{t+1} = \\theta^t - \\alpha * X^T(X\\theta - y)$</font>\n",
    "\n",
    "$X 形状为 (m, n+1)$\n",
    "\n",
    "$\\theta 形状为 (n+1, 1) $\n",
    "\n",
    "$y 形状为 (m, 1)$\n",
    "\n",
    "$X^T(X\\theta - y) 形状为 (n+1, 1)$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "976e3d26-93db-406b-a802-2b7a24061830",
   "metadata": {},
   "source": [
    "#### 一元一次线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7a246e43-5a33-4da5-a08e-c071d10cadaa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = np.random.rand(100, 1)\n",
    "w, b = np.random.randint(1, 10, size = 2)\n",
    "\n",
    "y = w * X + b + np.random.randn(100, 1)\n",
    "\n",
    "plt.figure(figsize = (4, 3))\n",
    "_ = plt.scatter(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "425a5a86-ad1f-4d2d-81ce-9c46ab2b533a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.concatenate([X, np.full(shape = (100, 1), fill_value = 1)], axis = 1)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1bcebb8b-e0a9-4694-91b7-817e3a07273f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 8 8\n",
      "求出的斜率和截距为 [7.74029459 8.13054632]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoches = 10000\n",
    "eta = 0.01\n",
    "\n",
    "#要求解的系数\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "for i in range(epoches):\n",
    "    #计算梯度\n",
    "    g = X.T @ (X @ theta - y)\n",
    "    #更新 theta\n",
    "    theta = theta - eta * g\n",
    "\n",
    "print('真实的斜率和截距为', w, b)\n",
    "print('求出的斜率和截距为', theta.flatten())\n",
    "\n",
    "# ------------------------\n",
    "\n",
    "plt.figure(figsize = (4, 3))\n",
    "_ = plt.scatter(X[:, [0]], y)\n",
    "\n",
    "x2 = np.array([0, 1])\n",
    "_ = plt.plot(x2, x2 * theta[0] + theta[1], color = 'red')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4a64c21-648f-40b0-9be8-c76fb92addcc",
   "metadata": {},
   "source": [
    "**逆时衰减：随着迭代次数添加，一点点变小学习率**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "104b12ad-1cf3-483a-ba90-bc9ce4023e12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 8 8\n",
      "求出的斜率和截距为 [7.74029459 8.13054632]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 可以被叫做逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "times = 0\n",
    "for i in range(epoches):\n",
    "    #计算梯度\n",
    "    g = X.T @ (X @ theta - y)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w, b)\n",
    "print('求出的斜率和截距为', theta.flatten())\n",
    "\n",
    "# ------------------------\n",
    "\n",
    "plt.figure(figsize = (4, 3))\n",
    "_ = plt.scatter(X[:, [0]], y)\n",
    "\n",
    "x2 = np.array([0, 1])\n",
    "_ = plt.plot(x2, x2 * theta[0] + theta[1], color = 'red')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec3f3516-8365-407e-ab2b-6b10d3569ea4",
   "metadata": {},
   "source": [
    "#### 多元一次线性回归"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f422fa4-6d1a-4ec3-82c4-6aa70b0ccb49",
   "metadata": {},
   "source": [
    "<font size=5>$y_{(m,1)} = X_{(m,n)}w_{(n,1)} + b + noise_{(m,1)}$</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "60906eec-7624-4d62-85b5-1a70367ec84f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 [6 6 7 4 9 9 6 9 5 4] 4\n",
      "求出的斜率和截距为 [6.07295779 6.78309825 7.03890545 4.65343829 8.96855287 8.80024085\n",
      " 6.2605074  8.68728894 4.96670744 4.45913122 3.37688115]\n",
      "偏差为 [-0.07295779 -0.78309825 -0.03890545 -0.65343829  0.03144713  0.19975915\n",
      " -0.2605074   0.31271106  0.03329256 -0.45913122  0.62311885]\n"
     ]
    }
   ],
   "source": [
    "m = 100 # 样本数\n",
    "n = 10 #特征数\n",
    "X = np.random.rand(m, n)\n",
    "w = np.random.randint(1, 10, size = (n, 1)) # 随机斜率\n",
    "b = np.random.randint(1, 10, size = 1)[0] # 随机截距\n",
    "\n",
    "y = X @ w + b + np.random.randn(m, 1)\n",
    "\n",
    "# ------------------------------\n",
    "\n",
    "X = np.concatenate([X, np.full(shape = (m, 1), fill_value = 1)], axis = 1)\n",
    "\n",
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数数组，[theta_1, theta_2, ..., theta_n, theta_0]，最后一个 theta_0 呼应上边添加的一列\n",
    "theta = np.random.randn(n + 1, 1)\n",
    "\n",
    "times += 0\n",
    "for i in range(epoches):\n",
    "    #计算梯度\n",
    "    g = X.T @ (X @ theta - y)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w.flatten(), b)\n",
    "print('求出的斜率和截距为', theta.flatten())\n",
    "print('偏差为', np.concatenate([w.flatten().reshape(1, -1), np.array([b]).reshape(1, -1)], axis = 1).flatten() - theta.flatten())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47857bba-01b9-4d86-a044-1ea014657a84",
   "metadata": {},
   "source": [
    "### SGD 随机梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7962653-5a9e-4fb0-95ac-f43ad39e86fd",
   "metadata": {},
   "source": [
    "<font size=6>$\\theta_k^{t+1} = \\theta_k^{t} - \\alpha * ((\\sum \\limits_{j=0}^n \\theta_jx_j^{(i)} - y^{(i)}) x_k^{(i)})$</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ca7f24a-88fb-4937-9041-f5b73b0a4b76",
   "metadata": {},
   "source": [
    "#### 一元一次线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "cc2dfe87-f668-4685-a044-d5ee34d36f94",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 8 3\n",
      "求出的斜率和截距为 [5.8237823  4.16895446]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = np.random.rand(100, 1)\n",
    "w, b = np.random.randint(1, 10, size = 2)\n",
    "\n",
    "y = w * X + b + np.random.randn(100, 1)\n",
    "\n",
    "# ------------------------------\n",
    "\n",
    "#添加截距列\n",
    "X = np.concatenate([X, np.full(shape = (100, 1), fill_value = 1)], axis = 1)\n",
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 可以被叫做逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "times = 0\n",
    "for i in range(epoches):\n",
    "    #随机取出一个样本\n",
    "    idx = np.random.randint(0, 100, size = 1)[0]\n",
    "    X_random = X[[idx]] # (1,2)\n",
    "    y_random = y[[idx]] # (1,1)\n",
    "    #计算梯度\n",
    "    g = X_random.T @ (X_random @ theta - y_random)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w, b)\n",
    "print('求出的斜率和截距为', theta.flatten())\n",
    "\n",
    "# ------------------------\n",
    "\n",
    "plt.figure(figsize = (4, 3))\n",
    "_ = plt.scatter(X[:, [0]], y)\n",
    "\n",
    "x2 = np.array([0, 1])\n",
    "_ = plt.plot(x2, x2 * theta[0] + theta[1], color = 'red')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1fd9f22b-553c-4b88-8f50-37a003cf6de1",
   "metadata": {},
   "source": [
    "#### 多元一次线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "71c5aff7-f065-4306-8bc9-e8727efadaa5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 [6 1 2 7 7 8 4 2 6 5] [3]\n",
      "求出的斜率和截距为 [3.8502448  3.70163228 3.26999611 4.86061925 5.21721701 5.56838373\n",
      " 3.86554986 4.03149036 4.98815926 4.86232651 4.91942342]\n"
     ]
    }
   ],
   "source": [
    "m = 100 # 样本数\n",
    "n = 10 #特征数\n",
    "X = np.random.rand(m, n)\n",
    "w = np.random.randint(1, 10, size = (n, 1)) # 随机斜率\n",
    "b = np.random.randint(1, 10, size = (1, 1))[0] # 随机截距\n",
    "\n",
    "y = X @ w + b + np.random.randn(m, 1)\n",
    "\n",
    "# ------------------------------\n",
    "\n",
    "#添加截距列\n",
    "X = np.concatenate([X, np.full(shape = (m, 1), fill_value = 1)], axis = 1)\n",
    "\n",
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数数组，[theta_1, theta_2, ..., theta_n, theta_0]，最后一个 theta_0 呼应上边添加的一列\n",
    "theta = np.random.randn(n + 1, 1)\n",
    "\n",
    "times += 0\n",
    "for i in range(epoches):\n",
    "    #随机取出一个样本\n",
    "    idx = np.random.randint(0, m, size = 1)[0]\n",
    "    X_random = X[[idx]] # (1, n+1)\n",
    "    y_random = y[[idx]] # (1, 1)\n",
    "    #计算梯度\n",
    "    g = X_random.T @ (X_random @ theta - y_random)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w.flatten(), b)\n",
    "print('求出的斜率和截距为', theta.flatten())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3321078d-dd6e-4b1a-91c1-7aa590a45f77",
   "metadata": {},
   "source": [
    "### MBGD 小批量梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33c59394-217e-4c4d-917c-36ea5330de05",
   "metadata": {},
   "source": [
    "#### 一元一次线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cd2eb23a-3b99-43ff-a40f-734a77877ac6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 4 4\n",
      "求出的斜率和截距为 [3.54784163 4.20316665]\n"
     ]
    }
   ],
   "source": [
    "X = np.random.rand(100, 1)\n",
    "w, b = np.random.randint(1, 10, size = 2)\n",
    "\n",
    "y = w * X + b + np.random.randn(100, 1)\n",
    "\n",
    "# ------------------------------\n",
    "\n",
    "#添加截距列\n",
    "X = np.concatenate([X, np.full(shape = (100, 1), fill_value = 1)], axis = 1)\n",
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 可以被叫做逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "batch_size = 16 # 每批样本数\n",
    "batch_num = 100 // batch_size # 一共多少批\n",
    "\n",
    "times = 0\n",
    "for i in range(epoches):\n",
    "    #随机取出一批\n",
    "    batch_idx_start = np.random.randint(0, batch_size * batch_num, size = 1)[0]\n",
    "    X_batch = X[batch_idx_start : (batch_idx_start + batch_size)]\n",
    "    y_batch = y[batch_idx_start : (batch_idx_start + batch_size)]\n",
    "    #计算梯度\n",
    "    g = X_batch.T @ (X_batch @ theta - y_batch)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w, b)\n",
    "print('求出的斜率和截距为', theta.flatten())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "62243e25-0546-4d4a-af4b-85fa588be870",
   "metadata": {},
   "source": [
    "#### 多元一次线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "111ec756-044a-4c12-be08-8e6e095f00c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真实的斜率和截距为 [4 5 1 7 8 5 7 2 5 1] [7]\n",
      "求出的斜率和截距为 [1.6302179  2.00301814 4.99326948 2.79418998 1.10022507 2.43400783\n",
      " 1.36794599 3.70985908 5.3200851  3.34873694 6.08515107]\n"
     ]
    }
   ],
   "source": [
    "m = 100 # 样本数\n",
    "n = 10 #特征数\n",
    "X = np.random.rand(m, n)\n",
    "w = np.random.randint(1, 10, size = (n, 1)) # 随机斜率\n",
    "b = np.random.randint(1, 10, size = (1, 1))[0] # 随机截距\n",
    "\n",
    "y = X @ w + b + np.random.randn(m, 1)\n",
    "\n",
    "# ------------------------------\n",
    "\n",
    "#添加截距列\n",
    "X = np.concatenate([X, np.full(shape = (m, 1), fill_value = 1)], axis = 1)\n",
    "\n",
    "epoches = 10000\n",
    "\n",
    "t0 = 5\n",
    "t1 = 1000\n",
    "def learning_rate_schedule(t): # 逆时衰减函数\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "#要求解的系数数组，[theta_1, theta_2, ..., theta_n, theta_0]，最后一个 theta_0 呼应上边添加的一列\n",
    "theta = np.random.randn(n + 1, 1)\n",
    "\n",
    "batch_size = 16 # 每批样本数\n",
    "batch_num = m // batch_size # 一共多少批\n",
    "\n",
    "times += 0\n",
    "for i in range(epoches):\n",
    "    #随机取出一批\n",
    "    batch_idx_start = np.random.randint(0, batch_size * batch_num, size = 1)[0]\n",
    "    X_batch = X[batch_idx_start : (batch_idx_start + batch_size)]\n",
    "    y_batch = y[batch_idx_start : (batch_idx_start + batch_size)]\n",
    "    #计算梯度\n",
    "    g = X_random.T @ (X_random @ theta - y_random)\n",
    "    #更新 theta\n",
    "    lr = learning_rate_schedule(times)\n",
    "    theta = theta - lr * g\n",
    "    times += 1\n",
    "\n",
    "print('真实的斜率和截距为', w.flatten(), b)\n",
    "print('求出的斜率和截距为', theta.flatten())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5abe86c0-efe5-47f6-89c0-3ff3f3015bd9",
   "metadata": {},
   "source": [
    "## 归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "905e479e-f4b8-420f-8040-5310591285c0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
